"""
数据解析内容解析类，用来解析数据格式，获取行头字段
"""
import copy
import re
from TestToolsV2.common.ActivityDatas import activityDatas
from TestToolsV2.tools.Log import Log

log = Log()


class interpretingData:
    def __init__(self, _activityDatas: activityDatas):
        self.activityDatas = _activityDatas
        self.pattern1 = "-?\d+\,-?\d+\,-?\d+"

    def PrintData(self):
        log.Show("----------------------interpretingData----------------------")
        log.Show(self.activityDatas.isCosts, 20, "isCosts")
        log.Show(self.activityDatas.reEditText, 20, "reEditText")
        log.Show(self.activityDatas.taEditText, 20, "taEditText")
        log.Show(self.activityDatas.reTitleDic, 20, "reTitleDic")
        log.Show(self.activityDatas.taTitleDic, 20, "taTitleDic")
        log.Show(self.activityDatas.reTitleDic, 40, "reTitleDic")
        log.Show(self.activityDatas.taTitleDic, 40, "taTitleDic")

    def do_interpretingData(self, dataNumber: int = 0):
        if dataNumber == 0:  # 如果是规划表
            # self.PrintData()
            return self.__get_resource()
        elif dataNumber == 1:  # 如果是基础表
            # self.PrintData()
            return self.__get_target()

    def __get_resource(self):
        """
        获取规划中有效字段数据，去除无效字段内容\n
        返回：解析后有效数据（奖励列表，和消耗列表）
        """
        dataList = []
        costList = []
        pattern_t = '\t'
        if pattern_t in self.activityDatas.reEditText:
            # 如果有制表符，将制表符替换成 空格
            mytext = self.activityDatas.reEditText.replace(pattern_t, ' ').strip()
        else:
            # mytext = text.replace(' ', ',')  # 如果有空格将空格替换成 ， 号
            mytext = self.activityDatas.reEditText.strip()

        objList = mytext.splitlines()  # 将字符串按行分割成行列表
        objList.pop(0)  # 删除第一行（行头：道具1 编号 数量 商品输出 消耗1 编号 数量 ...）

        if len(objList) > 0:
            for item in objList:
                # 将单行按空格分割成数据列表 演示：
                # ['红元神碎片自选箱', '11,20177', '20', '[[11,20177,20]]', '端', '11,800029', '20', '1400'...]
                strtemp = item.split()
                # 将提取的结果添加到data列表 提取数据演示：[['红元神碎片自选箱', '20']]
                dataList.append(self.__get_reLineValue(self.activityDatas.reTitleDic, strtemp))
                # 判断是否需要比对消耗
                if self.activityDatas.isCosts:
                    # 将提取的结果添加到cost列表 提取数据演示：[['端', '20'], ['午', '20']...]
                    costList.append(self.__get_reLineValue(self.activityDatas.reTitleDic, strtemp, 1))

        return dataList, costList

    def __get_target(self):
        """
        获取基础表有效数据，去除多余的字段数据\n
        返回：解析后有效数据（奖励列表，和消耗列表），以及对应品类编码，品类编码指的是reward字段中代表物品品类的编码，比如道具是10和11，英雄12
        """
        dataList = []
        costList = []
        dataTempList = []
        costTempList = []
        numberList = set()
        pattern_t = '\t'

        if pattern_t in self.activityDatas.taEditText:
            mytext = self.activityDatas.taEditText.replace('\t', ' ').strip()
        else:
            mytext = self.activityDatas.taEditText.strip()
        # 通过行分割成列表，格式：['[[11,800029,20],[11,800030,20],[11,800031,20],[11,800032,20]] [[11,20177,20]]',...]
        objList = mytext.splitlines()
        # 删掉首行（行头：costs rewards）
        objList.pop(0)

        if len(objList) > 0:
            for item in objList:
                if item:
                    # 将每一行通过空格将 costs对应的数据和 rewards对应的数据 提取成列表
                    # 格式：['[[11,800029,20],[11,800030,20],[11,800031,20],[11,800032,20]]', '[[11,20177,20]]']
                    strtemp = item.split()
                    # 匹配多个reward格式字符串 演示：['11,20177,20']
                    rewardsStr = re.findall(self.pattern1, strtemp[self.activityDatas.taTitleDic['rewards']])
                    if len(rewardsStr) > 0:
                        for data in rewardsStr:  # 格式：'11,20177,20'
                            strList = data.strip().split(',')  # 通过逗号分割成单个reward内容列表 演示：['11', '20177', '20']
                            numberList.add(strList[0])  # 添加品类编码
                            dataTempList.append(strList)  # 添加单个奖励
                    if self.activityDatas.isCosts:
                        # 匹配多个costs格式字符串 演示：['11,800029,20', '11,800030,20', '11,800031,20', '11,800032,20']
                        costsStr = re.findall(self.pattern1, strtemp[self.activityDatas.taTitleDic['costs']])
                        if len(costsStr) > 0:
                            for data in costsStr:
                                # 通过逗号分割成单个costs内容列表 演示：['11', '800030', '20']
                                strList = data.strip().split(',')
                                numberList.add(strList[0])  # 添加品类编码
                                costTempList.append(strList)  # 添加单个奖励
                    dataList.append(copy.deepcopy(dataTempList))
                    costList.append(copy.deepcopy(costTempList))
                    dataTempList.clear()
                    costTempList.clear()

            return dataList, costList, numberList

    @staticmethod
    def __get_reLineValue(reTitleDic: dict, strList: list, valueType=0, ):
        """
        通过字段下标获取列表对应下标的值\n
        :param reTitleDic: 规划数据字典
        :param strList: 通过空格分割的字符串列表
        :param valueType: 规划数据字典的检索类型：1 = costs, 0 = rewards
        :return:返回对应类型检索出来的下标的值
        """
        if not strList:
            return []

        if not reTitleDic:
            return []

        indexType = 'rewards'
        if valueType != 0:
            indexType = 'costs'
        str_length = len(strList)
        tempList = []
        for xList in reTitleDic[indexType]:
            x = xList[0]
            y = xList[1]
            if x >= str_length or y >= str_length:
                break
            tempList.append([strList[x], strList[y]])
        return tempList
